﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 事件案例3
{
    //于是，Event 出场了，它封装了委托类型的变量，使得：在类的内部，不管你声明它是public还是protected，它总是private 的。
    //在类的外部，注册“+=”和注销“-=”的访问限定符与你在声明事件时使用的访问符相同。我们改写GreetingManager 类，它变成了这个样子：

    public delegate void GreetingDelegate(string name);

    public class GreetingManager
    {
        //这一次我们在这里声明一个事件
        public event GreetingDelegate MakeGreet;

        public void GreetPeople(string name)
        {
            MakeGreet(name);
        }
    }


    class Program
    {
        private static void EnglishGreeting(string name)
        {
            Console.WriteLine("Good Morning, " + name);
        }

        private static void ChineseGreeting(string name)
        {
            Console.WriteLine("早上好, " + name);
        }

        //很容易注意到：MakeGreet 事件的声明与之前委托变量 delegate1 的声明唯一的区别是多了一个 event 关键字。
        //看到这里，在结合上面的讲解，你应该明白到：事件其实没什么不好理解的，声明一个事件不过类似于声明一个进行了封装的委托类型的变量而已。
        //为了证明上面的推论，如果我们像下面这样改写Main 方法
        static void Main(string[] args)
        {
            GreetingManager gm = new GreetingManager();
            //gm.MakeGreet = EnglishGreeting; // 编译错误1
            gm.MakeGreet += ChineseGreeting;
            gm.GreetPeople("Liker");
        }
    }
}
